package cn.tedu.csmall.stock.webapi.quartz;

import cn.tedu.csmall.stock.webapi.quartz.rabbit.RabbitMQJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 我们要将Job和Trigger绑定在一起,明确触发关系
// 绑定成功后,会有Scheduler来调度,这个对象程序运行时会被SpringBoot创建
// 所以在配置中,我们只需要将JobDetail和Trigger对象保存到Spring容器即可
@Configuration
public class QuartzConfig {

    // @Bean注解标记的方法返回值会在SpringBoot项目启动时保存到Spring容器
    @Bean
    public JobDetail showTime(){
        // JobDetail类是专用于封装Job接口实现类的类型
        // JobBuilder.newJob就是管理Job接口实现类的方法
        return JobBuilder.newJob(QuartzJob.class)
                // 给当前任务起名,不能和其它任务重名
                .withIdentity("showTime")
                // 在默认情况下,JobDetail对象实例化后,没有Trigger绑定,可能会给GC回收
                // 设置storeDurably()方法后,JobDetail对象即使没有被绑定,也不会被回收
                .storeDurably()
                .build();
    }

    // Trigger对象也要保存到Spring容器
    @Bean
    public Trigger showTimeTrigger(){
        // 声明变量定义cron表达式
        CronScheduleBuilder cron=
                CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
        // 开始实例化返回Trigger对象
        return TriggerBuilder.newTrigger()
                // 绑定要触发的JobDetail对象
                .forJob(showTime())
                // 绑定cron表达式
                .withSchedule(cron)
                // 设置名称
                .withIdentity("showTimeTrigger")
                .build();
    }


    //@Bean
    public JobDetail reduceStock(){
        return JobBuilder.newJob(RabbitMQJob.class)
                .withIdentity("reduceStock")
                .storeDurably()
                .build();
    }

    //@Bean
    public Trigger reduceStockTrigger(){
        CronScheduleBuilder cron=
                CronScheduleBuilder.cronSchedule("0/20 * * * * ?");
        return TriggerBuilder.newTrigger()
                .forJob(reduceStock())
                .withIdentity("reduceStockTrigger")
                .withSchedule(cron)
                .build();
    }



}
